/*
 * Title: 木块问题（The Blocks Problem）
 * Author: Yuanshun L
 * Created : 06-otc-2021
 */

#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;

const int maxn = 30+1;
int n; // n是木块的个数，q是执行操作的数量
vector<int> blocks[maxn];

// 搜索id编号的木块在哪个堆上
int find_pile(int id,int &h){
    for(int i=0;i<n;i++){ // 遍历堆
        if(!blocks[i].empty()){
            for(int j=0;j<blocks[i].size();j++){ // 遍历堆上的每个木块
                if(blocks[i][j] == id){
                    h = j;
                    return i;
                }
            }
        }
    }
    return -1;
}

// 归位p堆高h以上的木块
void clear_above(int p, int h){
    int temp;
    for(int i=h+1;i<blocks[p].size();i++){ // 遍历高h以上的木块
        temp = blocks[p][i];
        blocks[temp].push_back(temp);
    }
    blocks[p].resize(h+1);
}

// 把pa堆h以及以上的木块整体移动到pb堆的顶部
void move(int pa,int pb, int h){
    for(int i=h;i<blocks[pa].size();i++){
        blocks[pb].push_back(blocks[pa][i]);
    }
    blocks[pa].resize(h);
}

void print(){
    int first=0;
    for(int i=0;i<n;i++){
        first=0;
        cout<<i<<"堆: ";
        for(int j=0;j<blocks[i].size();j++){
            if(first) cout<<" ";
            else first=1;
            cout<<blocks[i][j];
        }
        printf("\n");
    }
}

int main() {
    string s1,s2;
    int a,b,pa,pb,ah,bh;

    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);

    cin>>n;
    // 初始化各个木块的位置
    for(int i=0;i<n;i++){
        blocks[i].push_back(i);
    }
    while(1){
        cin>>s1>>a>>s2>>b;
        if(s1[0]=='q') break;
        pa = find_pile(a,ah);
        pb = find_pile(b,bh);
        if(pa==pb) continue;
        if(s1[0]=='m') clear_above(pa,ah);
        if(s2[1]=='n') clear_above(pb,bh);
        move(pa,pb,ah);
    }
    print();
    return 0;
}